home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 1 / Mac Magazin and MacEasy Magazine CD - Issue 01.iso / Sharewarebibliothek / Powermac / C64 / SOURCE / Serial.c < prev    next >
Text File  |  1994-06-06  |  4KB  |  190 lines

  1. /*
  2.     Commodore 64 Emulator v0.4      Earle F. Philhower III 
  3.     Copyright (C) 1993-4            (st916w9r@dunx1.ocs.drexel.edu)
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. #include "Processor.h"
  21. #include "Traps.h"
  22. #include "Serial.h"
  23. #include "Error.h"
  24.  
  25. typedef struct
  26. {
  27.     byte inuse  : 1;
  28.     byte isopen : 1;
  29.     byte (*getf)(byte *, int);
  30.     byte (*putf)(byte, int);
  31.     byte (*openf)(char *, int, int);
  32.     byte (*closef)(int);
  33.     void (*flushf)(int);
  34. } SerialType;
  35. static SerialType device[16];
  36.  
  37. #define BUFFERLEN 127
  38. static byte serialBuffer[BUFFERLEN];
  39.  
  40. static byte serialPtr, latestListen, trapListen, latestSaListen;
  41.  
  42. static void SerialSendByte(void), SerialRecieveByte(void), SerialListen(void),
  43.             SerialSaListen(void), FloppyReadyTrap(void);
  44. static byte SerialDummy(void);
  45.  
  46. static trap serialTrap[] =
  47. {
  48.     { 0xed40, {0x78, 0x20, 0x97}, SerialSendByte },
  49.     { 0xee13, {0x78, 0xa9, 0x00}, SerialRecieveByte },
  50.     { 0xed0e, {0x20, 0xa4, 0xf0}, SerialListen },
  51.     { 0xed36, {0x78, 0x20, 0x8e}, SerialSaListen },
  52.     { 0xeea9, {0xad, 0x00, 0xdd}, FloppyReadyTrap }
  53. };
  54.  
  55. int SerialInitialize(void)
  56. {
  57.     byte i;
  58.     SerialType *p;
  59.     
  60.     AddTrap(serialTrap[0]);
  61.     AddTrap(serialTrap[1]);
  62.     AddTrap(serialTrap[2]);
  63.     AddTrap(serialTrap[3]);
  64.     AddTrap(serialTrap[4]);
  65.  
  66.     for (i = 0; i < 16; i++) {
  67.         p=&device[i];
  68.         p->getf=(byte (*)(byte *, int ))SerialDummy;
  69.         p->putf=(byte (*)(byte, int ))SerialDummy;
  70.         p->openf=(byte (*)(char *, int , int ))SerialDummy;
  71.         p->closef=(byte (*)(int ))SerialDummy;
  72.         p->flushf=(void (*)(int ))NULL; }
  73.     
  74.     return kNoError;
  75. }
  76.  
  77. void AddSerialDevice(int devnum, byte (*getf)(byte *, int),
  78.     byte (*putf)(byte, int), byte (*openf)(char *, int, int),
  79.     byte (*closef)(int), void (*flushf)(int))
  80. {
  81.     SerialType *p;
  82.  
  83.     if ((devnum<0)||(devnum>15)) InternalError(kInvalidDeviceNumber);
  84.     p=&device[devnum];
  85.     if (p->inuse!=0) InternalError(kDeviceNumberInUse);
  86.  
  87.     p->getf = getf;
  88.     p->putf = putf;
  89.     p->openf = openf;
  90.     p->closef = closef;
  91.     p->flushf = flushf;
  92.     p->inuse = 1;
  93. }
  94.  
  95.  
  96. static void SerialSendByte(void)
  97. {
  98.     byte data;
  99.     SerialType *p;
  100.     extern void i60(void);
  101.  
  102.     data=RAM[0x95];
  103.     p=&device[latestListen&0x0f];
  104.  
  105.     if (p->isopen==0) {
  106.         if (serialPtr<BUFFERLEN) serialBuffer[serialPtr++] = data; }
  107.     else (*p->putf)(data, latestSaListen & 0x0f);
  108.     i60();    /* RTS */
  109. }
  110.  
  111. static void SerialRecieveByte(void)
  112. {
  113.     byte pp;
  114.     SerialType *p;
  115.     extern void i60(void);
  116.  
  117.     p=&device[latestListen&0x0f];
  118.  
  119.     RAM[0x90]=(*p->getf)(&pp, latestSaListen&0x0f);
  120.     RAM[0xa4]=a=pp;
  121.     flags &= ~CAR;
  122.     i60();    /* RTS */
  123. }
  124.  
  125. static void SerialListen(void)
  126. {
  127.     extern void i60(void);
  128.     
  129.     trapListen=a;
  130.     i60();    /* RTS */
  131. }
  132.  
  133. static void SerialSaListen(void)
  134. {
  135.     SerialType *p;
  136.     byte b, i;
  137.     extern void i60(void);
  138.  
  139.     b=RAM[0x95];
  140.     p=&device[latestListen&0x0f];
  141.  
  142.     if (b==0x3f)
  143.         switch (latestSaListen&0xf0) {
  144.             case 0xf0:
  145.                  if (p->isopen==0) {
  146.                     p->isopen=1;
  147.                     i=(*p->openf)((char *)serialBuffer, serialPtr, latestSaListen&0x0f);
  148.                     serialPtr=0;
  149.                     RAM[0x90]=i;
  150.                     if (i) {
  151.                         p->isopen=0;
  152.                         (*p->closef)(latestSaListen&0x0f); } }
  153.                 if (p->flushf) (*p->flushf)(latestSaListen&0x0f);
  154.                 break;
  155.             case 0x60:
  156.                 if (p->isopen==0) {
  157.                     p->isopen=1;
  158.                     (*p->openf)(NULL, 0, latestSaListen&0x0f);
  159.                     for (i=0; i<serialPtr; i++)
  160.                         (*p->putf)(serialBuffer[i], latestSaListen&0x0f);
  161.                     serialPtr=0; }
  162.                 if (p->flushf) (*p->flushf)(latestSaListen&0x0f);
  163.                 break;
  164.             case 0xe0:
  165.                 p->isopen=0;
  166.                 (*p->closef)(latestSaListen&0x0f);
  167.                 break;
  168.             default:
  169.                 DebugStr("\pUnimplemented Serial Command"); break;
  170.             }
  171.  
  172.     latestListen=trapListen;
  173.     latestSaListen=b;
  174.  
  175.     i60();    /* RTS */
  176. }
  177.  
  178. static void FloppyReadyTrap(void)
  179. {
  180.     extern void i60(void);
  181.     
  182.     a = 0x01;
  183.     flags &=(~NEG+ZER);
  184.     i60();    /* RTS */
  185. }
  186.  
  187.  
  188.  
  189. static byte SerialDummy(void) { return 2; }
  190.